package com.flmz.common.core.domain;

import com.flmz.common.core.enums.ResultCode;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class R<T> {

	private int code; // 消息状态码，常量

	private String msg; // 消息内容，code 的辅助说明，一一对应

	private T data; // 请求某个接口返回的数据体

	public static <T> R<T> ok() {
		return assembleResult(null, ResultCode.SUCCESS);
	}

	public static <T> R<T> ok(T data) {
		return assembleResult(data, ResultCode.SUCCESS);
	}

	public static <T> R<T> fail() {
		return assembleResult(null, ResultCode.FAILED);
	}

	public static <T> R<T> fail(int code, String msg) {
		return assembleResult(code, msg, null);
	}

	/**
	 * 指定错误码
	 *
	 * @param resultCode 指定错误码
	 * @param <T>
	 * @return
	 */
	public static <T> R<T> fail(ResultCode resultCode) {
		return assembleResult(null, resultCode);
	}

	private static <T> R<T> assembleResult(T data, ResultCode resultCode) {
		R<T> r = new R<>();
		r.setCode(resultCode.getCode());
		r.setData(data);
		r.setMsg(resultCode.getMsg());
		return r;
	}

	private static <T> R<T> assembleResult(int code, String msg, T data) {
		R<T> r = new R<>();
		r.setCode(code);
		r.setData(data);
		r.setMsg(msg);
		return r;
	}
}
